
#import "GAStream.h"

#import "SocketBase.h"
#import <Foundation/NSTimer.h>

@interface GASocketOper : NSObject <GAStreamDelegate>{
  ///socket连接
  GAStream *m_pGAStream;
  ///认证步聚
  GASocketOperLoginStatus       m_nStep;
  ///读取状态
  GASocketOperReadStatus        m_nReadStatus;
  
  ///包头数据
  char  m_cReadHeadBuffer[8];
  ///当前读取包头数据大小
  int   m_nReadHeadSize;
  
  ///包体数据
  char  *m_pReadBodyBuffer;
  ///当前读取包体大小
  int   m_nReadBodySize;
  ///数据包体大小
  int   m_nBodySize;
  
  //socket状态通知
  GASocketOperNoticeCallBack    *m_pNoticeCallBack;
  
  ///发送数据缓冲区，只在没有发送成功时缓存数据，待发送缓冲状态可写时会把数据发送出去。
  NSMutableData* m_pSendData;
  
  long					m_lUserId;             //用户id
	char					m_strSessionId[32];			//sessionid
  
  //////////////add xzm 20140829////////////////////
  NSTimer       *m_pHeartTimer;  //发心跳定时器 30s 循环
  NSTimer       *m_pDataTimer;   //收数据定时器 10s 单例
  NSDate        *pBeginData;     //接收数据的时间
  NSDate        *pEndData;       //当前时间
  //////////////add end xzm 20140829////////////////////
}

@property (nonatomic) NSTimer *m_pHeartTimer;
@property (nonatomic) NSTimer *m_pDataTimer;

- (void)readHead:(void*)apData withSize:(int)anSize;
- (void)readBody:(void*)apData withSize:(int)anSize;
- (void)sendHeart;//收到数据回值00000
- (void)sendHeart2;//定时30s发送回值00004
- (void)onTimerSendHeart:(NSTimer*)t;//定时发心跳包
- (void)onCheckOutTime:(NSTimer*)t;//判断是否超时


//- (void)initOper;
/**设置服务器ip和端口
 *
 *  @param char*	apIP    服务器ip域名
 *  @param int    anPort  端口号
 *  @return
 *  @note 
 */
- (void)setServerIPPort:(char*)apServer withPort:(int)anPort;

/**连接到服务器
 *
 *  @return
 *  @note 
 */
- (void)connectToServer;

/**连接是否存在（正在连接和已经连接都认为存在）
 *
 *  @return
 *  @note 
 */
- (BOOL)isHaveConnect;

/**关闭连接
 *
 *  @return
 *  @note 
 */
- (void)close;

/**发送数据
 *
 *  @param char*	apSendBuffer    发送数据
 *  @param int    anSize          发送数据大小
 *  @return
 *  @note 
 */
- (void)writeBytes:(char*)apSendBuffer length:(unsigned int)anSize;

/**关闭连接
 *
 *  @return
 *  @note 
 */
- (void)clearSendData;


/**设置socket状态通知回调
 * 
 *  @param GASocketOperNoticeCallBack    回调接口
 *  @return
 *  @note 
 */
- (void)setStatusNotice:(GASocketOperNoticeCallBack*)pNoticeCallBack;

/**设置user id and session id
 * 
 *  @param long       alUserId          用户id
 *  @param char       *apSessionId      session id
 *  @return
 *  @note 
 */
- (void)setUserIdAndSessionId:(long)alUserId withSession:(char*)apSessionId;
@end
